#include "Sprite.h"


Sprite* InitialiserSprite(Sprite * pSprite, int x,int y,int w,int h,Terrain* pTer)
{
    pSprite=(Sprite*)malloc(sizeof(Sprite));
    pSprite->pPer=(Personnage*)malloc(sizeof(Personnage));
	pSprite->pPer->posX = x;
	pSprite->pPer->posY = y;
	pSprite->pPer->w = w;
	pSprite->pPer->h = h;
	pSprite->pTer = pTer;
	return pSprite;
}

int UpdateScroll(Terrain* pTer, Sprite * pSprite)
{
	int cxperso,xlimmin,xlimmax;
    if (pTer->focusSprite==NULL)
		return -1;
	cxperso = pTer->focusSprite->pPer->posX + pTer->focusSprite->pPer->w/2;
	xlimmin = pTer->xscroll + pTer->focusx;
	xlimmax = xlimmin + pTer->focusw;
	if (cxperso<xlimmin)
		pTer->xscroll -= (xlimmin-cxperso);
	if (cxperso>xlimmax)
		pTer->xscroll += (cxperso-xlimmax);
	return 0;
}

int LibereSprite(Sprite* pSprite)
{
	free(pSprite->pPer);
	free(pSprite);
	return 0;
}

int CollisionDecors(Sprite* pSprite)
{
	int xmin,xmax,ymin,ymax,i,j,indicetile;
	Terrain* pTer = pSprite->pTer;
	if (pSprite->pPer->posX<0 || pSprite->pPer->posY<0 || (pSprite->pPer->posY + pSprite->pPer->h -1)>=pTer->nbtiles_hauteur_monde*pTer->HAUTEUR_TILE) /* Test si le personnage ne sort pas du monde*/
		return 1;
	xmin = pSprite->pPer->posX / pTer->LARGEUR_TILE; /* Le x minimum de notre boite englobante.*/
	ymin = pSprite->pPer->posY / pTer->HAUTEUR_TILE; /* Le y minimum de notre boite englobante.*/
	xmax = (pSprite->pPer->posX + pSprite->pPer->w -1) / pTer->LARGEUR_TILE; /* Le x maximum de notre boite englobante.*/
	ymax = (pSprite->pPer->posY + pSprite->pPer->h -1) / pTer->HAUTEUR_TILE; /* Le y maximum de notre boite englobante.*/
	for(i=xmin;i<=xmax;i++)
	{
		for(j=ymin;j<=ymax;j++)
		{
			indicetile = pTer->schema[i%pTer->nbtiles_largeur_monde][j];
			if (pTer->tileplein[indicetile]==1)
			{
				return 1;
			}
        }
	}
	return 0;
}

int EssaiDeplacement(Sprite* pSprite,int vx,int vy)
{
	Sprite test;
	test = *pSprite;
	test.pPer->posX+=vx;
	test.pPer->posY+=vy;
	if (CollisionDecors(&test)==0)
	{
		*pSprite = test;
		return 1;
	}
	return 0;
}

void Affine(Sprite* pSprite,int vx,int vy)
{
	int i;
	for(i=0;i<ABS(vx);i++)
	{
		if (EssaiDeplacement(pSprite,SGN(vx),0)==0)
			break;
	}
	for(i=0;i<ABS(vy);i++)
	{
		if (EssaiDeplacement(pSprite,0,SGN(vy))==0)
			break;
	}
}

int DeplaceSprite(Sprite* pSprite,int vx,int vy)
{
	if (vx>=pSprite->pTer->LARGEUR_TILE || vy>=pSprite->pTer->HAUTEUR_TILE)
	{
		DeplaceSprite(pSprite,vx-vx/2,vy-vy/2);/* Si vx ou vy trop grand, on relance la fonction avec des vecteurs deux fois plus petit*/
		return 0;
	}
	if (EssaiDeplacement(pSprite,vx,vy)==1)
		return 0;
	Affine(pSprite,vx,vy);
	return 0;
}

int persMort(Sprite * pSprite, int vx, int vy)
{
    EssaiDeplacement(pSprite,vx,vy);

    if(EssaiDeplacement(pSprite,vx,vy)==0)
    {
        return 1;
    }
    return 0;
}
